//函子是一个容器
class Container{
    static of(value){//返回一个函子对象的静态方法 
        return new Container(value)
    }

    //定义一个构造函数  函子内部要有一个值 
    constructor (value){
        //函子内部存储传过来的value一个值 是内部私有的 _value表示
        this._value=value
    }
        //对外提供一个map接收一个处理值得函数 并返回一个新的函子 
    map(fn){
        return Container.of(fn(this._value)) //把处理的值结果返回新的函子
    }
}

//Maybe函子对外部传递空值做处理

class Maybe{
    static of(x){
        return new Maybe(x)
    }
    constructor(x){
        this._value=x
    }

    map(fn){
        //如果为null返回一个null的函子对象
        return this.isNothing() ? this : Maybe.of(fn(this._value))
    }

    isNothing(){
        //判断传入的值是否null或undefind
        return this._value===null||this._value===undefined
    }

}

module.exports={Maybe,Container}